/**
*裁剪器,这个是裁剪3角面用的
*/

package kgame5.k3d.core.render {
import flash.geom.*;

public class Culler{
	public static const 
		CULL_NONE:int=0,//不裁剪背面
		CULL_BACK:int=1,//裁剪背面
		CULL_FRONT:int=2;//裁剪前面
	
	public function Culler(){
		
	}
	
	//判断一个三角形是否在viewport内,x0,y0...是屏幕上的点的坐标
	public static function IsTrifaceInViewport(x0:Number,y0:Number,x1:Number,y1:Number,x2:Number,y2:Number,EW:Number,EH:Number):Boolean{
		
		var rect_faceTest:Rectangle=new Rectangle();//一个三角面的外接矩形，用这个判断是否可以裁剪，必须用矩形!
		var rect_3DArea:Rectangle=new Rectangle();//3d显示区域的矩形,用来计算裁剪用的
	
		//如果三角的外围矩形不在屏幕内，则不画
		rect_3DArea.width=EW;
		rect_3DArea.height=EH;
		
		rect_faceTest.x = Math.min(x2, Math.min(x1, x0));
		rect_faceTest.width = Math.max(x2, Math.max(x1, x0))-(rect_faceTest.x);
		rect_faceTest.y = Math.min(y2, Math.min(y1,y0));
		rect_faceTest.height = Math.max(y2, Math.max(y1, y0)) -(rect_faceTest.y);
		
		return rect_3DArea.intersects(rect_faceTest);
		
	}
	//计算三角面是顺时针还是逆时针，从而决定是否裁剪.x0,y0...是屏幕上的点的坐标
	//TODO 注意这个没处理点在屏幕外的情况
	public static function CanCull(x0:Number,y0:Number,x1:Number,y1:Number,x2:Number,y2:Number,cullType:int):Boolean{
		//temp是计算三角面是顺时针还是逆时针，从而决定是否裁剪
		var temp:Number=(x2 - x0 ) * ( y1 - y0 ) - ( y2 - y0 ) * ( x1 - x0 );
		switch(cullType){
			case CULL_NONE:
			return false;//不用裁剪
			case CULL_BACK:
			if( temp< 0 ){//需要裁剪
				return true;
			}
			break;
			case CULL_FRONT:
			if( temp >0 ){//需要裁剪
				return true;
			}
			break;
		}
		return false;
	}
	
}//end of class
}

/////////////////////////////////
/*
//判断能否裁剪掉这个三角面
	//a,b,c是3个点的索引，如aIB:Array=a2IB[iStripIdx],a:int=aIB[0];
	private function CanCull(a:int,b:int,d:int,
								aVBF:Vector.<Number>,aScreen:Vector.<Number>,
								EW:Number,EH:Number,
								cullType:int):Boolean{
		//Part 1,投影面后不显示
//		if(aVBF[a*3+2]<0||aVBF[b*3+2]<0||aVBF[d*3+2]<0){//3个点的aVBF（就是在摄象机坐标系里）有一个在z<0就不画
//			return true;
//		}
		
		//Part 2,视窗外的三角不显示
		//最终3个点在屏幕上的位置
		var x0:Number=aScreen[a*2];
		var y0:Number=aScreen[a*2+1];
								    
		var x1:Number=aScreen[b*2]; 
		var y1:Number=aScreen[b*2+1]; 

		var x2:Number=aScreen[d*2];
		var y2:Number=aScreen[d*2+1];
							
//		if(Culler.IsTrifaceInViewport(x0,y0,x1,y1,x2,y2,EW,EH)==false){//三角形在视窗外可以裁剪掉
//			return true;
//		}
		
		//Part 3:根据是否三角形背面判断是否需要裁剪
		return Culler.CanCullTriface(x0,y0,x1,y1,x2,y2,cullType);
	}
//*/